package com.evasion.persistence.dao.impl;

import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.Query;

import com.evasion.persistence.dao.factorydao.AbstractDao;
import com.evasion.persistence.entidades.DatosGenerale;

@Stateless
public class EmpresaDAO extends AbstractDao<DatosGenerale> {

	/**
	 * Constructor por defecto que inicializa el AbstractDao con la clase
	 * entidad
	 */
	public EmpresaDAO() {
		super(DatosGenerale.class);
	}

	/**
	 * Obtiene una lista de empresas por cliente
	 * parametro
	 * 
	 * @param nombreCliente
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<DatosGenerale> getEmpresasPorCliente(String nombreCliente, Date fechaInicio, Date fechaFin) {

		List<DatosGenerale> empresasRes = null;
		Query query = null;
		try {
			if(fechaInicio!=null && fechaFin!=null)
			{
				query = em
						.createQuery("SELECT b FROM DatosGenerale b WHERE UPPER(b.nombreComercial) LIKE UPPER(:nombreCliente)"
								+ " and fechaRegistro BETWEEN :fechaInicio AND :fechaFin");
				query.setParameter("nombreCliente", "%" + nombreCliente + "%");
				query.setParameter("fechaInicio", fechaInicio );	
				query.setParameter("fechaFin", fechaFin);	
			} else{
			 query = em
					.createQuery("SELECT b FROM DatosGenerale b WHERE UPPER(b.nombreComercial) LIKE UPPER(:nombreCliente)");
			query.setParameter("nombreCliente", "%" + nombreCliente + "%");
			}
			if (query.getResultList() != null) {
				empresasRes = (List<DatosGenerale>) query.getResultList();
				return empresasRes;
			}
		} catch (Exception e) {
			System.out.println("No se pudo encontrar los datos error: " + e);
		}
		return empresasRes;

	}
	
	/**
	 * Obtiene una lista de empresas que coinciden con la region dado como
	 * parametro
	 * 
	 * @param nombreCliente
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<DatosGenerale> getEmpresasPorRegion(String region, Date fechaInicio, Date fechaFin) {

		List<DatosGenerale> empresasRes = null;
		Query query = null;
		try {
			if(fechaInicio!=null && fechaFin!=null)
			{
				query = em
						.createQuery("SELECT b FROM DatosGenerale b WHERE UPPER(b.region) LIKE UPPER(:region)"
								+ " and fechaRegistro BETWEEN :fechaInicio AND :fechaFin");
				query.setParameter("region", "%" + region + "%");
				query.setParameter("fechaInicio", fechaInicio );	
				query.setParameter("fechaFin", fechaFin);	
			} else{
			query = em
					.createQuery("SELECT b FROM DatosGenerale b WHERE UPPER(b.region) LIKE UPPER(:region)");
			query.setParameter("region", "%" + region + "%");
			}
			if (query.getResultList() != null) {
				empresasRes = (List<DatosGenerale>) query.getResultList();
				return empresasRes;
			}
		} catch (Exception e) {
			System.out.println("No se pudo encontrar los datos por region error: " + e);
		}
		return empresasRes;

	}
	
	@SuppressWarnings("unchecked")
	public List<DatosGenerale> getEmpresasPorEstadoEvasion(String estadoEvasion, Date fechaInicio, Date fechaFin) {

		List<DatosGenerale> empresasRes = null;
		Query query = null;
		try {
			if(fechaInicio!=null && fechaFin!=null)
			{
				query = em
						.createQuery("SELECT b FROM DatosGenerale b WHERE UPPER(b.situacion) = UPPER(:estadoEvasion)"
								+ " and fechaRegistro BETWEEN :fechaInicio AND :fechaFin");
				query.setParameter("estadoEvasion", estadoEvasion);
				query.setParameter("fechaInicio", fechaInicio );	
				query.setParameter("fechaFin", fechaFin);	
			} else{
			 query = em
					.createQuery("SELECT b FROM DatosGenerale b WHERE UPPER(b.situacion) = UPPER(:estadoEvasion)");
			query.setParameter("estadoEvasion",   estadoEvasion);
			}
			if (query.getResultList() != null) {
				empresasRes = (List<DatosGenerale>) query.getResultList();
				return empresasRes;
			}
		} catch (Exception e) {
			System.out.println("No se pudo encontrar los datos por region error: " + e);
		}
		return empresasRes;

	}
	
	@SuppressWarnings("unchecked")
	public List<DatosGenerale> obtenerTodasPorRangoFecha( Date fechaInicio, Date fechaFin) {

		List<DatosGenerale> empresasRes = null;
		try {
				Query query = em
						.createQuery("SELECT b FROM DatosGenerale b WHERE"
								+ " fechaRegistro BETWEEN :fechaInicio AND :fechaFin");
				query.setParameter("fechaInicio", fechaInicio );	
				query.setParameter("fechaFin", fechaFin);	
			
			if (query.getResultList() != null) {
				empresasRes = (List<DatosGenerale>) query.getResultList();
				return empresasRes;
			}
		} catch (Exception e) {
			System.out.println("No se pudo encontrar todas la  empresas por rango de fechas error: " + e);
		}
		return empresasRes;

	}
}